#1、勾子函数
    #把外函数的运行结果传递到内函数中运行
    #外函数就是内函数的勾子

def out_fun(year):
    def inner_fun(month):
        print(f'{year}年{month}月')
    return inner_fun    #把内部函数当做外部函数的返回值
t = out_fun('2025')     #把2025传递给year，函数out_fun的运行结果(运行结果是inner_fun)赋值给t
                        #函数out_fun运行结束后，它的参数year也不会释放，内函数inner_fun可以继续使用
t('4')                  #t就是inner_fun

#2、装饰器
    #装饰器是添加在函数上面，可以让函数使用装饰器的功能，但是函数又不用写装饰器的代码(外挂)
def f1(fun):
    def f2():
        print('前置脚本')
        fun()
        print('后置脚本')
    return f2
@f1
def csyl():         #函数f1是函数csyl的装饰器，csyl具备f1的功能，但是它不需要写f1的代码
    print('执行测试用例')
csyl()

#3、classmethod装饰器
    #可以装饰在方法上，让这个方法可以不用实例化直接调用
class C():
    @classmethod
    def f1(self):
        print('我是f1')
    @classmethod
    def f2(self):
        print('我是f2')
#类中方法必须先实例化，然后利用对象去调用方法
c1=C()
c1.f1()
c1.f2()
#直接调用类方法会报错，加上classmethod装饰器，它就可以直接调用
C.f1()
C.f2()